package py.com.sole.solesys;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FlowEvent;
import org.primefaces.event.SelectEvent;
import py.com.sole.dao.DaoFactory;
import py.com.sole.dto.ProfesorPersonaDTO;
import py.com.sole.model.Direccion;
import py.com.sole.model.Materia;
import py.com.sole.model.Profesor;

@ManagedBean
@SessionScoped
public class ProfesorBean extends Persona implements Serializable {

  /**
   *
   */
  private static final long serialVersionUID = 1L;
  private final static Logger logger = Logger.getLogger(ProfesorBean.class);

  @ManagedProperty(value = "#{materiaBean}")
  private MateriaBean materia;
  private Materia materiaModel;
  private List<MateriaBean> materias;

  private List<Profesor> listProfesores;

  private List<MateriaBean> materiaSelected;

  private List<ProfesorPersonaDTO> profesores;
  private Profesor profesor;
  private ProfesorPersonaDTO profesorSelected;
  private boolean bloquearBotones = true;

  private Materia mat;

  @PostConstruct
  private void init() {
    materiaSelected = new ArrayList<MateriaBean>();
    materiaModel = new Materia();
    profesores = DaoFactory.getProfesor().getProfesorPersona();
  }

  public String onFlowProcess(FlowEvent event) {
    return event.getNewStep();
  }

  public void clean() {

    this.setNombre(null);
    this.setApellido(null);
    this.setDireccion(null);
    this.setDocumento(null);
    this.setTelefono(null);
    this.setEmail(null);

    this.profesorSelected = null;
    this.materiaSelected = null;
    this.materia.setListaMatSelec(null);
    this.setBloquearBotones(true);

  }

  public void saveProfesor() {

    FacesContext context = FacesContext.getCurrentInstance();

		
    Direccion direccion = new Direccion();
    direccion.setDescripcion(this.getDireccion());
    direccion.setCiudad(this.getCiudad());

		//DaoFactory.getDireccion().addDireccion(direccion);
    py.com.sole.model.Persona perProfesor = new py.com.sole.model.Persona();
    Profesor profesor = new Profesor();
    perProfesor.setNombre(this.getNombre());
    perProfesor.setApellido(this.getApellido());
    perProfesor.setDireccion(direccion);
    //perProfesor.setSexo(this.getSexo().charAt(0));
    perProfesor.setSexo("N");
    perProfesor.setEmail(this.getEmail());
    perProfesor.setTelefono(this.getTelefono());
    perProfesor.setTipoDocumentoId(this.getTipoDocumento());
    perProfesor.setDocumento(this.getDocumento());

    DaoFactory.getPersona().addPersona(perProfesor);
    profesor.setPersona(perProfesor);
    profesor.setMateriaList(this.materia.getListaMatSelec());
    profesor.setActivo(true);

    DaoFactory.getProfesor().addProfesor(profesor);

    context.addMessage(null, new FacesMessage("Mensaje", "Profesor "
                                              + profesor.getPersona().getNombre() + " almacenado exitosamente"));

    profesores = DaoFactory.getProfesor().getProfesorPersona();

    this.clean();
  }

  @SuppressWarnings(value = "all")
  public void seleccionarMateria(SelectEvent event) {
    this.setMateriaSelected((List<MateriaBean>) event.getObject());
    this.mat = DaoFactory.getMateria().getMateriaById((this.materiaSelected).get(id).getId());
    this.mat.setDescripcion(profesor.getMateriaList().get(id).getDescripcion());
    this.setBloquearBotones(false);
    RequestContext.getCurrentInstance().update("form-materia:dtMateria");
    RequestContext.getCurrentInstance().update("profesor-form");
  }

  public void searchProfesores() {
    List<Profesor> profesores = DaoFactory.getProfesor().getProfesorByFilter(this.getTipoDocumento(), this.getNombre(), this.getApellido(), this.getDocumento());

    if (profesores.isEmpty()) {
      FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN, "Resultado de la consulta", "No se encontraron registros");
      FacesContext.getCurrentInstance().addMessage(null, message);
    } else if (profesores.size() == 1) {
      this.setNombre(profesores.get(0).getPersona().getNombre());
      this.setApellido(profesores.get(0).getPersona().getApellido());
      this.setDireccion(profesores.get(0).getPersona().getDireccion().getDescripcion());
      this.setCiudad(profesores.get(0).getPersona().getDireccion().getCiudad());
      this.setTipoDocumento(profesores.get(0).getPersona().getTipoDocumentoId());
      this.setDocumento(profesores.get(0).getPersona().getDocumento());
      this.setTelefono(profesores.get(0).getPersona().getTelefono());
      this.setEmail(profesores.get(0).getPersona().getEmail());
      RequestContext.getCurrentInstance().update("profesor-form");
    } else {
      this.setListProfesores(profesores);
    }
  }

  public void onRowSelect(SelectEvent event) {

    this.profesorSelected = (ProfesorPersonaDTO) event.getObject();
    this.profesor = DaoFactory.getProfesor().getProfesorById(this.profesorSelected.getId());
    direccion = (profesor.getPersona().getDireccion().getDescripcion());
    ciudad = (profesor.getPersona().getDireccion().getCiudad());
    nombre = (profesor.getPersona().getNombre());
    apellido = (profesor.getPersona().getApellido());
    tipoDocumento = (profesor.getPersona().getTipoDocumentoId());
    documento = (profesor.getPersona().getDocumento());
    telefono = (profesor.getPersona().getTelefono());
    email = (profesor.getPersona().getEmail());

    this.setBloquearBotones(false);
    RequestContext.getCurrentInstance().update("form-edit:pnlGridProfesor");
    RequestContext.getCurrentInstance().update("form-edit");
    RequestContext.getCurrentInstance().update("profesor-form");
  }

  public void setMateria(List<MateriaBean> materias) {
    this.materias = materias;

  }

  public void newMateria() {
    MateriaBean m = new MateriaBean();
    m.setDescripcion(materia.getDescripcion());
    this.materias.add(materias.size(), m);

  }

  public void addMaterias(ValueChangeEvent event) {

    this.materiaModel = (Materia) event.getSource();
    MateriaBean m = new MateriaBean();
    m.setId(materiaModel.getId());
    m.setDescripcion(materiaModel.getDescripcion());
    this.materiaSelected.add(materiaSelected.size(), m);
  }

  public void onRowMateria(SelectEvent event) {
    this.materiaModel = (Materia) event.getObject();
    MateriaBean m = new MateriaBean();
    m.setDescripcion(materiaModel.getDescripcion());
    this.materias.add(materias.size(), m);
    RequestContext.getCurrentInstance().execute("dlgMateriaList.hide()");
    RequestContext.getCurrentInstance().update("profesor-form:pnlProfesores");
  }

  public List<MateriaBean> getMaterias() {
    return materias;
  }

  public void setMaterias(List<MateriaBean> materias) {
    this.materias = materias;
  }

  @SuppressWarnings(value = "all")
  public boolean filterByNombre(Object value, Object filter, Locale locale) {

    String filterText = (filter == null) ? null : filter.toString().trim();

    if (filterText == null || filterText.equals("")) {
      return true;
    }

    if (value == null) {
      return false;
    }

    return ((Comparable<String>) value).compareTo(filterText) > 0;

  }

  public void deleteProfesor() {
    //DaoFactory.getProfesor().deleteProfesor(this.getProfesorSelected().getId());
    Profesor profesor = DaoFactory.getProfesor().getProfesorById(
      this.getProfesorSelected().getId());
    FacesContext context = FacesContext.getCurrentInstance();

    profesor.getPersona().setNombre(this.getNombre());
    profesor.getPersona().setApellido(this.getApellido());
    Direccion dire = profesor.getPersona().getDireccion();
    dire.setCiudad(ciudad);
    dire.setDescripcion(direccion);
    dire = DaoFactory.getDireccion().updateDireccion(dire);
    profesor.getPersona().setDireccion(dire);
    profesor.getPersona().getTipoDocumentoId();
    profesor.getPersona().setDocumento(this.getDocumento());
    profesor.getPersona().setTelefono(this.getTelefono());
    profesor.getPersona().setEmail(this.getEmail());
    profesor.setActivo(false);
    DaoFactory.getProfesor().updateProfesor(profesor);
    context.addMessage(null, new FacesMessage("Mensaje", "Profesor "
                                              + " eliminado exitosamente"));

    profesores = DaoFactory.getProfesor().getProfesorPersona();
    this.clean();
  }

  public void editProfesor() {
    Profesor profesor = DaoFactory.getProfesor().getProfesorById(
      this.getProfesorSelected().getId());
    FacesContext context = FacesContext.getCurrentInstance();

    profesor.getPersona().setNombre(this.getNombre());
    profesor.getPersona().setApellido(this.getApellido());
    Direccion dire = profesor.getPersona().getDireccion();
    dire.setCiudad(ciudad);
    dire.setDescripcion(direccion);
    dire = DaoFactory.getDireccion().updateDireccion(dire);
    profesor.getPersona().setDireccion(dire);
    profesor.getPersona().getTipoDocumentoId();
    profesor.getPersona().setDocumento(this.getDocumento());
    profesor.getPersona().setTelefono(this.getTelefono());
    profesor.getPersona().setEmail(this.getEmail());

    DaoFactory.getProfesor().updateProfesor(profesor);
    context.addMessage(null, new FacesMessage("Mensaje", "Profesor "
                                              + " editado exitosamente"));

    profesores = DaoFactory.getProfesor().getProfesorPersona();
    this.clean();
  }

  public ProfesorPersonaDTO getProfesorSelected() {
    return profesorSelected;
  }

  public void setProfesorSelected(ProfesorPersonaDTO profesorSelected) {
    this.profesorSelected = profesorSelected;
  }

  public MateriaBean getMateria() {
    return materia;
  }

  public void setMateria(MateriaBean materia) {
    this.materia = materia;
  }

  public Materia getMateriaModel() {
    return materiaModel;
  }

  public void setMateriaModel(Materia materiaModel) {
    this.materiaModel = materiaModel;
  }

  public List<ProfesorPersonaDTO> getProfesores() {
    if (profesores == null) {
      profesores = DaoFactory.getProfesor().getProfesorPersona();
    }
    return profesores;
  }

  public void setProfesores(List<ProfesorPersonaDTO> profesores) {
    this.profesores = profesores;
  }

  public List<Profesor> getListProfesores() {
    return listProfesores;
  }

  public void setListProfesores(List<Profesor> listProfesores) {
    this.listProfesores = listProfesores;
  }

  public boolean isBloquearBotones() {
    return bloquearBotones;
  }

  public void setBloquearBotones(boolean bloquearBotones) {
    this.bloquearBotones = bloquearBotones;
  }

  public List<MateriaBean> getMateriaSelected() {
    return materiaSelected;
  }

  public void setMateriaSelected(List<MateriaBean> materiaSelected) {
    this.materiaSelected = materiaSelected;
  }

  public Profesor getProfesor() {
    return profesor;
  }

  public void setProfesor(Profesor profesor) {
    this.profesor = profesor;
  }

}
